package com.tangyee.home_knowledge.dao;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Color;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.CursorAdapter;
import android.widget.EditText;
import android.widget.SimpleCursorAdapter;
import android.widget.TextView;
import android.widget.Toast;

import com.tangyee.R;
import com.tangyee.home_knowledge.util.KeyBoardUtil;
import com.tangyee.home_knowledge.view.SearchRecordListView;

/**
 * @author: yu huawen
 * @date: 2019/1/31 13:46
 */
public class dsafdsf {

    public class SearchRecordDAO {

        // 上下文
        private Context context;
        // 搜索页面的view
        private View v;
        // 搜索框组件
        private EditText searchEdit; // 搜索编辑区
        private TextView searchClearHistory;  // 删除搜索记录按键
        // ListView列表 & 适配器
        private SearchRecordListView listView;
        private BaseAdapter adapter;
        // 数据库变量,用于存放历史搜索记录
        private RecordSQLiteOpenHelper helper ;
        private SQLiteDatabase db;

        // 构造器，里面的两个变量从搜索页面传入
        public SearchRecordDAO(Context context, View v){
            this.context = context;
            this.v = v;
            init();
        }

        /**
         * 作用：初始化搜索框
         */
        public void init(){
            // 初始化UI组件(搜索栏编辑框、历史记录列表、删除所有历史记录按钮)
            initView();
            // 实例化数据库SQLiteOpenHelper子类对象
            helper = new RecordSQLiteOpenHelper(context);
            // 第1次进入时查询所有的历史搜索记录，并显示在listview上，并且清除历史记录按钮是可见的
            queryData("");
            /**
             * "清空搜索历史"按钮
             */
            searchClearHistory.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // 清空数据库
                    deleteData();
                    // 模糊搜索空字符 = 显示所有的搜索历史（此时是没有搜索记录的）
                    queryData("");
                }
            });
            /**
             * 监听输入键盘更换后的搜索按键
             * 调用时刻：点击键盘上的搜索键时
             */
            searchEdit.setOnKeyListener(new View.OnKeyListener() {
                public boolean onKey(View v, int keyCode, KeyEvent event) {
                    if (keyCode == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN) {
                        // 点击搜索键后，对该搜索字段在数据库是否存在进行检查（查询）
                        boolean hasData = hasData(searchEdit.getText().toString().trim()); // 去掉左右边空格
                        // 若存在，则不保存；若不存在，则将该搜索字段保存（插入）到数据库，并作为历史搜索记录
                        if (!hasData && !searchEdit.getText().toString().trim().equals("")) {
                            Toast.makeText(context, "需要搜索的是" + searchEdit.getText(), Toast.LENGTH_SHORT).show();
                            insertData(searchEdit.getText().toString().trim());
                            queryData("");
                        }
                        // 隐藏键盘
                        KeyBoardUtil.hideKeyBoard(v);
                    }
                    return false;
                }
            });
            /**
             * 搜索框的文本变化实时监听
             */
            searchEdit.addTextChangedListener(new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                }
                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {
                }
                // 输入文本后调用该方法
                @Override
                public void afterTextChanged(Editable s) {
                    // 每次输入后，模糊查询数据库 & 显示
                    // 注：若搜索框为空,则模糊搜索空字符 = 显示所有的搜索历史
                    String tempName = searchEdit.getText().toString();
                    queryData(tempName);
                }
            });
            /**
             * 搜索记录列表（ListView）监听
             * 即当用户点击搜索历史里的字段后,会直接将结果当作搜索字段进行搜索
             */
            listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    // 获取用户点击列表里的文字,并自动填充到搜索框内
                    TextView textView = (TextView) view.findViewById(android.R.id.text1);
                    String name = textView.getText().toString();
                    searchEdit.setText(name);
                    // 隐藏键盘
                    KeyBoardUtil.hideKeyBoard(v);
                    //这里跳转到相应的搜索页面结果
                    Toast.makeText(context, name, Toast.LENGTH_SHORT).show();
                }
            });
        }

        /**
         * 绑定搜索框xml视图里的组件
         */
        public void initView(){
            // 绑定搜索框EditText
            searchEdit = (EditText) v.findViewById(R.id.search_edit);
            // 历史搜索记录 = ListView显示
            listView = (SearchRecordListView) v.findViewById(R.id.search_record_listview);
            // 删除历史搜索记录按钮
            searchClearHistory = (TextView) v.findViewById(R.id.search_clear_history);
            searchClearHistory.setVisibility(View.INVISIBLE);
        }

        /**
         * listview设置适配器,利用适配器设置listview 的字体颜色
         * 模糊查询数据 & 显示到ListView列表上
         */
        public void queryData(String tempName) {
            // 模糊搜索
            Cursor cursor = helper.getReadableDatabase().rawQuery(
                    "select id as _id,name from records where name like '%" + tempName + "%' order by id desc ", null);
            // 创建adapter适配器对象 & 装入模糊搜索的结果
            adapter = new SimpleCursorAdapter(context, android.R.layout.simple_list_item_1, cursor, new String[] { "name" },
                    new int[] { android.R.id.text1 }, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER){
                @Override
                public View getView(int position, View convertView, ViewGroup parent) {
                    View view = super.getView(position, convertView, parent);
                    TextView text = (TextView) view.findViewById(android.R.id.text1);
                    text.setTextColor(Color.rgb(108,107,107));
                    return view;
                }
            };
            // listview的设置适配器
            listView.setAdapter(adapter);
            adapter.notifyDataSetChanged();
            System.out.println(cursor.getCount());
            // 当输入框为空 & 数据库中有搜索记录时，显示 "删除搜索记录"按钮
            if (tempName.equals("") && cursor.getCount() != 0){
                searchClearHistory.setVisibility(View.VISIBLE);
            }
            else {
                searchClearHistory.setVisibility(View.INVISIBLE);
            };
        }

        /**
         * 清空数据库
         */
        public void deleteData() {
            db = helper.getWritableDatabase();
            db.execSQL("delete from records");
            db.close();
            searchClearHistory.setVisibility(View.INVISIBLE);
        }

        /**
         * 检查数据库中是否已经有该搜索记录
         */
        public boolean hasData(String tempName) {
            // 从数据库中Record表里找到name=tempName的id
            Cursor cursor = helper.getReadableDatabase().rawQuery(
                    "select id as _id,name from records where name =?", new String[]{tempName});
            //  判断是否有下一个
            return cursor.moveToNext();
        }

        /**
         * 插入数据到数据库，即写入搜索字段到历史搜索记录
         */
        public void insertData(String tempName) {
            db = helper.getWritableDatabase();
            db.execSQL("insert into records(name) values('" + tempName + "')");
            db.close();
        }
    }

}
